#!/bin/bash
set -e

# --- 配置 ---
PROJECT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
LOG_FILE="$PROJECT_DIR/deploy.log"
APP_LOG_FILE="$PROJECT_DIR/app.log"
APP_PORT=8001 # 定义应用的端口号

# --- 主要部署逻辑 ---
main() {
    echo "================================================="
    echo "===== 开始部署测试项目: $(date)!! ====="
    echo "================================================="

    cd "$PROJECT_DIR"
    
    echo ">>> 正在拉取 master 分支..."
    git reset --hard HEAD
    git clean -df -e "*.log" -e ".venv/"
    git pull origin master

    echo ">>> 正在激活虚拟环境并安装依赖..."
    source .venv/bin/activate
    pip install -r requirements.txt

    # --- 重启应用（端口查杀增强版） ---
    echo ">>> 正在重启应用..."

    # 1. ‼️【重要更新】直接通过端口号杀死旧进程
    echo "  -> 正在检查并停止占用端口 $APP_PORT 的旧进程..."
    # 使用 fuser 命令来查找并杀死占用指定TCP端口的进程
    # -k 表示 kill，-n tcp 表示指定协议
    # || true 是为了防止在没有进程占用端口时命令报错导致脚本退出
    fuser -k -n tcp "$APP_PORT" || echo "端口 $APP_PORT 未被占用，无需停止。"
    
    # 等待一两秒，确保端口被完全释放
    sleep 2
    
    # 2. 在后台启动新的进程
    echo "  -> 正在后台启动新应用..."
    nohup flask run --host=0.0.0.0 --port="$APP_PORT" > "$APP_LOG_FILE" 2>&1 &
    
    # 3. 检查新进程是否成功启动
    sleep 2 # 等待一会，让应用有时间启动
    # 同样用 fuser 来检查新进程是否成功监听了端口
    if fuser -n tcp "$APP_PORT" >/dev/null 2>&1; then
        echo "  -> 新应用启动成功！已开始监听端口 $APP_PORT"
        echo "===== ✅ 部署成功！应用已在后台启动 ====="
    else
        echo "  -> ‼️ 错误：新应用启动失败！请检查应用日志: $APP_LOG_FILE"
        echo "===== ❌ 部署失败！ ====="
    fi
}

# --- 执行主函数并将所有输出追加到部署日志文件 ---
main >> "$LOG_FILE" 2>&1
echo "" >> "$LOG_FILE"
